Ayer, después de cenar, me puse a jugar un rato con la Raspberry Pi. Como hacía un par de semanas que no me conectaba y estaba muy cansado para hacer cualquier otra cosa productiva, decidí lanzar una actualización de la RPi.
Por cierto, si alguna vez quieres finalizar una ventana de screen (en vez de desengancharla), el comando es "Ctrl+a, k" (de kill).
El comando sudo apt-get update no tardó demasiado, pero cuando lancé sudo apt-get upgrade el proceso de actualización se encalló bajando un paquete de documentación de unos cuantos megas... Estaba cansado y decidí desconectarme de RPi, aún sabiendo que esto detendría el proceso de actualización y en otro momento me tocaría volver a lanzarlo y empezar la descarga de nuevo...
Recordaba que había algún comando en Linux que permitía desconectarse de una sesión y dejar los procesos funcionando, así que hoy he preguntado a un compañero del trabajo y me ha hablado de screen.
screen es un comando que abre una sesión virtual en la consola. Los comandos lanzados desde esta consola virtual están en una sesión "interna", dentro de la sesión remota iniciada a través de SSH. Así, cuando desconectemos la sesión SSH los comandos siguen ejecutándose en la consola virtual de screen ya que no se "enteran" de que nos hemos desconectado.
Aunque en mi caso la necesidad para dejar procesos funcionando aún estando desconectado surgió del cansancio, screen es una herramienta muy útil para dejar corriendo tareas largas sin necesidad de estar constantemente conectado a un equipo remoto.
Usando screen
El uso de screen es de lo más sencillo; en primer lugar, hay que instalarlo mediante sudo apt-get install screen.
Una vez instalado, arrancamos una sesión virtual mediante el comando screen. Después de mostrar información relativa al programa, la licencia, etc, y volvemos al prompt. Solo que no es el prompt del terminal, sino el de screen.
A partir de este momento, cuando lanzamos comandos éstos se ejecutan dentro de la sesión virtual de screen. Así, si se corta la conexión o tenemos que desconectarnos por algún motivo, "desenganchamos" la sesión mediante la combinación de teclas "Ctrl+a" seguido de "d".
El comando d indica que queremos desenganchar (detach) la sesión de screen. Una vez desenganchada, podemos cerrar sesión con la seguridad de que el proceso seguirá funcionando con normalidad.
La combinación de teclas "Ctrl+a" sirve para indicar a screen que queremos pasarle un comando. Por tanto, todos los comandos de screen siguen el mismo patrón: "Ctrl+a" y una letra (generalmente la primera letra de la palabra inglesa que designa el comando).
Si volveremos a conectar con el equipo, reenganchamos la sesión virtual mediante screen -r (de reattach).
Con estos dos únicos comandos -"Ctrl+a, d" (desenganchar) y "screen -r" (re-enganchar) ya cubres el 90% de los escenarios en los que usarás screen.
A continuación dejo un gif animado que demuestra cómo se deja un ping a Google funcionando en segundo plano aunque nos desconectemos del equipo remoto:
screen a fondo
Por supuesto, screen permite hacer muchas cosas más que simplemente dejar procesos corriendo en una sesión desconectada (aunque sólo por ello ya es una gran herramienta).
Para obtener una lista de los comandos disponibles puedes lanzar man screen o desde dentro de screen, "Ctrql+a, ?".
Si necesitas más de una ventana virtual, puedes crear una nueva consola virtual desde dentro de screen o puedes desengancharte de la consola virtual activa ("Ctrl+a,d") y crear una nueva consola virtual con "screen".
Para mirar las sesiones de screen que están desenganchadas, usa "screen -ls". La salida del comando muestra un identificador y el estado de la sesión virtual:
Air:~ xavi$ screen -lsThere is a screen on:5199.ttys000.Air (Detached)1 Socket in /var/folders/x4/p1w4g8l13d1dl8npvrdn5l4r0000gn/T/.screen.
Usando este identificador puedes reconectar con la sesión especificada (aunque esto sólo es útil si tienes más de una consola desenganchada). Si en vez del nombre feo y difícil de recordar quieres nombrar tu ventana de manera concreta, puedes hacerlo lanzando "screen -S actualizacion_RPi", de manera que puedas ver claramente qué ventana corresponde a cada cosa que tienes en marcha.
Puedes combinar los parámetros -d y -r (y D, R), jugando con su orden para, por ejemplo, forzar el desenganche de una ventana de screen desde otro equipo y re-engancharla en la consola actual y cosas por el estilo:
-d|-D [pid.tty.host] does not start screen, but detaches the elsewhere running screen session. It has the same effect as typing "C-a d" from screen's controlling terminal.
-D is the equivalent to the power detach key. If no session can be detached, this option is ignored. In combination with the -r/-R option more powerful effects can be achieved:
-d -r Reattach a session and if necessary detach it first.
-d -R Reattach a session and if necessary detach or even create it first.
-d -RR Reattach a session and if necessary detach or create it. Use the first session if more than one session is available.
-D -r Reattach a session. If necessary detach and logout remotely first.
-D -R Attach here and now. In detail this means: If a session is running, then reattach. If necessary detach and logout remotely first. If it was not running create it and notify the user. This is the author's favorite.
-D -RR Attach here and now. Whatever that means, just do it.
Note: It is always a good idea to check the status of your sessions by means of "screen -list".
También puedes crear una ventana pero no engancharla, lo que es útil para lanzar scripts en su propia "ventana" y dejarlos corriendo.
Otro detalle interesante es que puedes bloquear la ventana virtual de screen mediante "Ctrl+a,x", de manera que cuando alguien quiera reconectar esa ventana, deberá introducir el password del usuario con sesión iniciada. Para los extra-paranoicos, es posible además crear un password propio de screen, de manera que para desbloquear una ventana sea necesario introducir este segundo password, específico de screen.
En esta página puedes encontrar una guía de refencia rápida de screen porque, como dice su autor, la página del manual es demasiado larga ;)
Otro detalle interesante es que puedes bloquear la ventana virtual de screen mediante "Ctrl+a,x", de manera que cuando alguien quiera reconectar esa ventana, deberá introducir el password del usuario con sesión iniciada. Para los extra-paranoicos, es posible además crear un password propio de screen, de manera que para desbloquear una ventana sea necesario introducir este segundo password, específico de screen.
En esta página puedes encontrar una guía de refencia rápida de screen porque, como dice su autor, la página del manual es demasiado larga ;)
Conclusión
screen es una de esas herramientas que no usas hasta que la necesitas, pero que cuando empiezas a utilizarla ya no puedes vivir sin ella. Poder lanzar procesos largos con la tranquilidad mental de que puedes desengancharte en cualguier momento sin perder el trabajo que tienes a medias es un salvavidas.Por cierto, si alguna vez quieres finalizar una ventana de screen (en vez de desengancharla), el comando es "Ctrl+a, k" (de kill).
Comentarios